{{Assignment|Zhum|Dexter}}
{{algorithm
| name = Partitioning Around Medoids
| serial_complexity =
| input_data =
| output_data =
| pf_height =
| pf_width =
}}
'''Авторы''':
* [[Участник:Avasilenko|А.Э.Василенко]] (отвечает за программистскую составляющую);
* [[Участник:Anastasia|А.В.Тузикова]] (отвечает за математическую составляющую).
Вклад авторов считать равноценным, чётких границ ответственности провести невозможно.
==Свойства и структура алгоритма==
=== Общее описание алгоритма ===
Объединение схожих объектов в группы - один из важнейших видов человеческой деятельности[Rousseeuw P. J., Kaufman L. Finding Groups in Data. – Wiley Online Library, 1990.]. Более того - это важная часть процесса познания мира, в котором мы живем. Мы учим детей различать кошек и собак, воду и песок, мужчин и женщин путем постоянного развития и улучшения подсознательных схем классификации. Примеры есть и во взрослой жизни – в химии необходимо классифицировать соединения, в археологии – объединять находки по периодам и т.д.
'''Задача кластеризации''' - разделение множества объектов на заданное число множеств с минимизацией некоторого функционала - является популярной задачей, относится к разделу машинного обучения и находит применение в таких областях, как анализ текста, биоинформатика, интеллектуальные транспортные системы и др. [ Речкалов Т.В. Параллельный алгоритм кластеризации для многоядерного сопроцессора Intel Xeon Phi // Суперкомпьютерные дни в России: Труды vеждународной конференции. – М.: Изд-во МГУ, 2015, c. 532.]
Существует несколько видов кластеризации[Маннинг К.Д., Введение в информационный поиск: пер. с англ. / К.Д. Маннинг, П. Рагхаван, Х.Шютце - М. : Вильямс, 2011. - 528.]:
* ''плоская кластеризация'' (''flat clustering'') - порождает совокупность кластеров, не имеющих явных взаимосвязей;
* ''иерархическая кластеризация'' (''hierarchical clustering'') - создаёт иерархию кластеров.
'''PAM''' ('''Partitioning Around Medoids''') - плоский алгоритм кластеризации, позволяющий выделить кластеров (множеств), удовлетворяющих следующим свойствам:
* каждая группа содержит хотя бы один объект;
* каждый объект принадлежит ровно одной группе.
Модель [Kaufman, L. and Rousseeuw, P.J., Clustering by means of Medoids. In: Y. Dodge and North-Holland, editor. Statistical Data Analysis Based on the L1-Norm and Related Methods. Springer US; 1987, p. 405–416.], лежащая в основе алгоритма PAM, основана на выборе объектов, являющихся характерными точками соответствующего кластера. Таким образом, кластерам сопоставляются принадлежащие им объекты, называемые '''медоидами''', на основании которых распределяются остальные объекты по принципу наибольшего сходства. Cама модель называется моделью '''k-medoids''' (не путать с моделью ''k-median'').
PAM состоит из двух фаз: '''BUILD''' и '''SWAP''':
* на фазе BUILD выполняется первичная кластеризация, в ходе которой последовательно выбираются объектов в качестве медоидов;
* фаза SWAP представляет собой итерационный процесс, в ходе которого производятся попытки улучшить множество медоидов. Алгоритм выполняет поиск пары объектов (медоид, не-медоид), минимизирующих целевую функцию при замене, после чего обновляет множество медоидов.
На каждой итерации алгоритма выбирается пара (медоид, не-медоид) такая, что замена медоида на не-медоид дает лучшую кластеризацию из возможных. Оценка кластеризации выполняется с помощью целевой функции, вычисляемой как сумма расстояний от каждого объекта до ближайшего медоида:
:
Процедура изменения множества медоидов повторяется, пока есть возможность улучшения значения целевой функции.
=== Математическое описание алгоритма ===
''Исходные данные'':
* множество кластеризуемых объектов , где - кортеж, состоящий из вещественных чисел;
* симметрическая матрица , элементы матрицы - вычисленные расстояния между объектами ;
* количество кластеров
''Обозначения'':
* - множество медоидов,
* - множество не-медоидов, где
* , где — метрика расстояния;
* - значение целевой функции для заданных множеств и
* - изменение целевой функции на -м шаге фазы SWAP.
''Выходные данные'':
* - множество медоидов;
* - искомые кластеры.
''Вычислительные формулы метода'':
* ''фаза BUILD'' (состоит из шагов последовательного выбора медоидов):
**
**
**
**
** ...
**
* ''фаза SWAP'' (итерационный процесс):
** начальное приближение:
** -й шаг итерации:
*** вычисление целевой функции при оптимальной замене (замене, при которой достигается лучшая кластеризация из возможных на текущей итерации):
*** определение пары (медоид, не-медоид), на которой достигается оптимальная замена:
*** проверка критерия останова;
*** изменение множеств в соответствии с выбранной парой
** критерий останова:
***
=== Вычислительное ядро алгоритма ===
'''Вычислительное ядро алгоритма PAM на этапе BUILD''' состоит из многочисленных вычислений значений целевой функции при различных вариантах выбора дополнительного медоида (шаг алгоритма ):
где:
*
*
С каждой итерацией количество вариантов выбора дополнительных медоидов уменьшается на единицу, таким образом, на -м шаге целевую функцию нужно вычислить лишь раз.
''Оптимизация'':
* таким образом, на каждой последующей итерации можно использовать величину, вычисленную на предыдущем шаге, что позволяет сократить число вычислений минимумов.
'''Вычислительное ядро алгоритма PAM на этапе SWAP''' состоит из многочисленных вычислений значений целевой функции при различных вариантах замены некоторого существующего медоида на элемент из числа не-медоидов. -я итерация фазы SWAP:
''Оптимизация'':
* таким образом, при поиске пары (медоид, не-медоид), наилучшим образом минимизирующей целевую функцию, происходит поиск минимума по всем возможным элементам , для которых вычисляется , где есть и является инвариантом по отношению к что позволяет предвычислить элемент
=== Макроструктура алгоритма ===
''Опишем макрооперации алгоритма'':
* в случае если алгоритму PAM на вход подаётся набор точек с их координатами в пространстве то необходимо вычислить матрицу расстояний. Для этого может быть использована, например, евклидова метрика:
*: , где
* нахождение минимального среди значений, принимаемых некоторой функцией определённой на дискретном множестве
*:
* вычисление вектора инвариантов, используемых при оптимизации фазы SWAP (см. вычислительное ядро алгоритма):
*: где номер итерации;
* вычисление вектора расстояний от каждой точки заданного множества до ближайшего медоида из множества где номер итерации фазы SWAP:
*:
* сложение компонент вектора:
''Макроструктура вычислительного ядра алгоритма PAM'' может быть выражена через макрооперации следующим образом:
* для ядра фазы BUILD:
*:::
*::: где
*# вычисляется раз;
*# находится раз при вычислении наилучшего значения целевой функции на текущей итерации.
* для ядра фазы SWAP:
*::: где:
*# находится раз в процессе вычисления макрооперации
*# вычисляется раз и использует вычисленные на шаге 1 минимальные значения;
*# вычисляется раз и использует вычисленные на шаге 2 значения
*# вычисляется раз и использует вычисленные на шаге 3 значения
*# находится раз при вычислении наилучшего значения целевой функции на текущей итерации.
=== Схема реализации последовательного алгоритма ===
''Псевдокод алгоритма'':
'''Вход''' : Множество объектов или матрица расстояний , количество кластеров
'''Выход''' : Множество медоидов
0 Если на вход было подано множество объектов, необходимо предварительно вычислить матрицу расстояний;
1 Инициализация множеств
// фаза BUILD
2 '''for (int i := 1; i <= k; i++)''' {
// Найти
{
3 Для всех вычислить
4 Положить равным , соответствующему минимальному из вычисленных
}
5 Обновить множества
}
// фаза SWAP
6 '''while (1)''' {
// Найти пару на которой достигается оптимальная замена:
{
7 Для всех вычислить // вычисление проводить с учётом приведённой ранее оптимизации (см. 1.3 [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]]);
8 Положить пару равной паре , соответствующей минимальному из вычисленных
}
9 Вычислить // критерий останова (см. 1.2 [[#Математическое описание алгоритма|Математическое описание алгоритма]])
10 '''if''' {
11 Обновить множества
12 } '''else''' {
13 '''break''';
}
};
''Оптимизации'':
* '''Предвычисление матрицы расстояний'''. Необходимо предварительно вычислить матрицу расстояний и сохранить её в памяти, так как в ходе вычисления алгоритма многократно используются расстояния между элементами, а вычисление каждого из них является ресурсоёмкой операцией из нескольких умножений и одного извлечения квадратного корня.
* '''Минимизация кеш-промахов'''. Матрица расстояний, к которой постоянно выполняется доступ на чтение для вычисления минимумов и их суммирования, должна храниться в памяти как матрица размера , несмотря на то, что она симметрическая и достаточно хранить лишь половину (элементы над или под главной диагональю). Данная оптимизация потребует использования в 2 раза большего количества памяти для хранения расстояний (а это является главным расходом памяти программы, так как все остальные используемые данные являются временными (локальными для каждой операции) и представляют из себя несколько векторов длинной элементов). Однако так как в данном алгоритме доступ к матрице осуществляется построчно (в [[#Вычислительное ядро алгоритма|вычислительном ядре алгоритма]] поэлементно ищутся минимумы 2-х векторов, после чего все они складываются), то в этом случае из матрицы можно будет читать данные по строкам подряд, что снижает количество кеш-промахов. Использование только половины матрицы приводит к частым промахам в кеше в связи с необходимостью загрузки части векторов по строкам, а части - по столбцам.
=== Последовательная сложность алгоритма ===
Для вычисления '''матрицы расстояний''' требуется:
* операций вычисления расстояний;
* сложность каждой операции вычисления расстояния (для случая использования Евклидовой метрики) равна операций сложения и вычитания, операций возведения в квадрат (умножения) и операции извлечения квадратного корня.
На основании формулы из описания '''вычислительного ядра фазы BUILD''' определим сложность выполнения всего этапа.
Обозначим:
* - операция сложения двух вещественных чисел;
* - операция нахождения минимума для двух вещественных чисел.
Тогда, количество операций равно:
:
Таким образом, сложность фазы BUILD есть как по количеству найденных минимумов, так и по количеству операций сложения.
На основании формулы из описания '''вычислительного ядра фазы SWAP''' определим сложность вычисления целевой функции с использованием оптимизации процесса нахождения минимума (см. раздел [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]]). Количество операций равно:
Таким образом, сложность одной итерации фазы SWAP есть как по количеству найденных минимумов, так и по количеству операция сложения.
Полученные оценки позволяют говорить о том, что PAM относится к алгоритмам '''с квадратичной сложностью'''.
Основная вычислительная сложность алгоритма PAM приходится на фазу SWAP, т.к. сложность одной её итерации сопоставима со сложностью всей фазы BUILD, однако SWAP может содержать в себе огромное число итераций.
=== Информационный граф ===
==== Информационный граф фазы BUILD ====
Опишем граф фазы BUILD как аналитически, так и в виде рисунка.
''Граф состоит из шести групп вершин'':
# Операция M, соответствующая '''первой''' группе вершин, осуществляет изменение множества медоидов:
#:: где
#: Единственная координата (номер итерации), соответствующая каждой из вершин, меняется в диапазоне принимая все целочисленные значения.
#: Аргументами операции являются:
#:* - результат срабатывания операции, соответствующей вершине из пятой группы с координатой
#:* - множество медоидов:
#:** при - входное данное алгоритма;
#:** при - результат срабатывания операции, соответствующей вершине из первой группы с координатой
#: Результат срабатывания операции является:
#:* при - ''промежуточным данным'' алгоритма;
#:* при - ''выходным данным'' фазы BUILD.
#:
#:
#:
# Операция O, соответствующая '''второй''' группе вершин, осуществляет изменение множества не-медоидов:
#::
#: Единственная координата , соответствующая каждой из вершин, меняется в диапазоне принимая все целочисленные значения.
#: Аргументами операции являются:
#:* - результат срабатывания операции, соответствующей вершине из пятой группы с координатой
#:* - множество не-медоидов:
#:** при - входное данное алгоритма;
#:** при - результат срабатывания операции, соответствующей вершине из второй группы с координатой
#: Результат срабатывания операции является:
#:* при - ''промежуточным данным'' алгоритма;
#:* при - ''выходным данным'' фазы BUILD.
#:
#:
#:
# Операция, соответствующая '''третьей''' группе вершин, выглядит следующим образом:
#::